<?php
    
    require_once APPPATH . 'dao/TipoDocumentoDAO.php';
    require_once APPPATH . 'dao/CategoriaDAO.php';
    require_once APPPATH . 'dao/SocioDAO.php';
    require_once APPPATH . 'dao/CuponDAO.php';
    
    /**
     * Representa un script que actualiza el estado de los socios; esto es, los pasa de Habilitados a Morosos,
     * de Morosos a Baja Técnica, de Baja Técnica a Baja Total Habilitado y de Baja Total Habilitado a Baja
     * Total Inhabilitado a medida que pasa el tiempo y se siguen debiendo cuotas.
     */
    class ActualizarEstadosSocios extends MY_Controller {
        
        function __construct() {
            parent::__construct();
    	}
        
        /*
         * index() se ejecuta por defecto al ser cargado del controlador
         */
        public function index(){
            
            $socioDAO = new \SocioDAO();
            $socios = $socioDAO->getSocios();
            
            $cuponDAO = new \CuponDAO();
            
            $anioActual = date("Y");
            $mesActual = date("m");
            $diaActual = date("d");
            
            //Para cada socio en el sistema, se verifica su estado actual con la fecha del sistema y se verifica
            //si se le ha vencido el plazo de pago. De ser así se lo pasa al siguiente estado, según corresponda.
            foreach($socios as $socio){
                $idSocio = $socio->getId();
                $idEstado = $socio->getEstado()->getId();
                
                $anioVencimientoEstado = $socio->getVencimientoEstado()->format('Y');
                $mesVencimientoEstado = $socio->getVencimientoEstado()->format('m');
                $diaVencimientoEstado = $socio->getVencimientoEstado()->format('d');
                
                if($this->fechaMayor($diaVencimientoEstado,$mesVencimientoEstado,$anioVencimientoEstado,
                                                $diaActual,$mesActual,$anioActual)){
                
                    switch ($idEstado) {
                        case 1:
                            if($cuponDAO->getCuponesNoPagadosVencidos($idSocio) > 0)
                                $idEstado = 2;
                            $diaVencimientoEstado = $socio->getVencimientoEstado()->modify('+1 month')->format('d');
                            $mesVencimientoEstado = $socio->getVencimientoEstado()->format('m');
                            $anioVencimientoEstado = $socio->getVencimientoEstado()->format('Y');

                            break;

                        case 2:
                            if($cuponDAO->getCuponesNoPagadosVencidos($idSocio) == 0){
                                $idEstado = 1;
                                $diaVencimientoEstado = $socio->getVencimientoEstado()->modify('+1 month')->format('d');
                            }
                            else if($cuponDAO->getCuponesNoPagadosVencidos($idSocio) == 1)
                                $diaVencimientoEstado = $socio->getVencimientoEstado()->modify('+1 month')->format('d');
                            else{
                                $idEstado = 3;
                                $diaVencimientoEstado = $socio->getVencimientoEstado()->modify('+12 month')->format('d');
                            }
                                
                                $mesVencimientoEstado = $socio->getVencimientoEstado()->format('m');
                                $anioVencimientoEstado = $socio->getVencimientoEstado()->format('Y');

                            break;

                         case 3:
                                $idEstado = 4;
                                $diaVencimientoEstado = $socio->getVencimientoEstado()->modify('+36 month')->format('d');
                                $mesVencimientoEstado = $socio->getVencimientoEstado()->format('m');
                                $anioVencimientoEstado = $socio->getVencimientoEstado()->format('Y');

                            break;

                         case 4:
                                $idEstado = 5;
                                $diaVencimientoEstado = $socio->getVencimientoEstado()->modify('+99 year')->format('d');
                                $mesVencimientoEstado = $socio->getVencimientoEstado()->format('m');
                                $anioVencimientoEstado = $socio->getVencimientoEstado()->format('Y');
                             
                             break;

                    }
                }
                
                $socioDAO->actualizarEstadoSocio($idSocio,$idEstado,$diaVencimientoEstado,
                                                $mesVencimientoEstado,$anioVencimientoEstado);
                
            }
            
            //Se cargan los datos de la cabecera del sistema.
            $dataCab['title'] = 'Sistema de Administración de Socios';
            $dataCab['textoSuperiorIzq'] = 'DEFENSORES DE LA TECNO';
            $dataCab['css'] = '<link rel="stylesheet" type="text/css" href="' . site_url() . 'application/views/css_estandar/css_pestanias.css" media="screen" />
                               <link rel="stylesheet" type="text/css" href="' . site_url() . 'application/views/css_estandar/datos_form_css.css" media="screen" />';
            $dataCab['nombre'] = 'Administrador';
            $dataCab['posicionamiento'] = 'Home > Actualizar Estados';
            
            //Se carga la cabecera
            $this->load->view('cabecera',$dataCab);
            //Se carga una vista con un mensaje de aviso de ejecución.
            $this->load->view('actualizarEstadosSocios');
            //Se carga una vista con etiquetas de cierre de html y body, y otras mas
            $this->load->view('cierre');
            
        }
        
        /**
         * Función accesoria que compara las fechas recibidas como parámetro, separadas en 3 argumentos
         * para cada fecha.
         * 
         * @param type $dia1
         * @param type $mes1
         * @param type $anio1
         * @param type $dia2
         * @param type $mes2
         * @param type $anio2
         * @return boolean 
         */
        private function fechaMayor($dia1, $mes1, $anio1, $dia2, $mes2, $anio2){
            
            $mayor = FALSE;
            
            if(((int)$anio2 > (int)$anio1) || ((int)$anio2 == (int)$anio1 && (int)$mes2 > (int)$mes1) || 
                    ((int)$anio2 == (int)$anio1 && (int)$mes2 == (int)$mes1 && (int)$dia2 > (int)$dia1))
                $mayor = TRUE;
            
            return $mayor;
            
        }
        
        /**
         * Método que testea el controlador.
         */
        public function test(){
            
            $i=0;
            
            $test = $this->actualizarEstadoTest(1,'10','12','2011','11','12','2011');
            $expected_result = array(2,'10','1','2012');
            $test_name = 'Prueba ' . ++$i . ' - Prueba Paso de Socio Habilitado a Socio Moroso';
            $this->unit->run($test, $expected_result, $test_name);
            
            $test = $this->actualizarEstadoTest(1,'13','12','2011','11','12','2011');
            $expected_result = array(1,'13','12','2011');
            $test_name = 'Prueba ' . ++$i . ' - Prueba Estado Habilitado No Vencido';
            $this->unit->run($test, $expected_result, $test_name);
            
            $test = $this->actualizarEstadoTest(2,'10','12','2011','11','12','2011');
            $expected_result = array(3,'10','10','2012');
            $test_name = 'Prueba ' . ++$i . ' - Prueba Paso de Socio Moroso a Socio en Baja Técnica';
            $this->unit->run($test, $expected_result, $test_name);
            
            $test = $this->actualizarEstadoTest(2,'13','12','2011','11','12','2011');
            $expected_result = array(2,'13','12','2011');
            $test_name = 'Prueba ' . ++$i . ' - Prueba Estado Moroso No Vencido';
            $this->unit->run($test, $expected_result, $test_name);
            
            $test = $this->actualizarEstadoTest(3,'10','12','2011','11','12','2011');
            $expected_result = array(4,'10','12','2013');
            $test_name = 'Prueba ' . ++$i . ' - Prueba Paso de Socio en Baja Técnica a Socio en Baja Total';
            $this->unit->run($test, $expected_result, $test_name);
            
            $test = $this->actualizarEstadoTest(3,'13','12','2011','11','12','2011');
            $expected_result = array(3,'13','12','2011');
            $test_name = 'Prueba ' . ++$i . ' - Prueba Estado Socio en Baja Técnica No Vencido';
            $this->unit->run($test, $expected_result, $test_name);
            
            $test = $this->actualizarEstadoTest(4,'10','12','2011','11','12','2011');
            $expected_result = array(5,'10','12','2110');
            $test_name = 'Prueba ' . ++$i . ' - Prueba Paso de Socio en Baja Total Inhabilitado a Socio en Baja Total Habilitado';
            $this->unit->run($test, $expected_result, $test_name);
            
            $test = $this->actualizarEstadoTest(4,'13','12','2011','11','12','2011');
            $expected_result = array(4,'13','12','2011');
            $test_name = 'Prueba ' . ++$i . ' - Prueba Estado Socio en Baja Total Inhabilitado';
            $this->unit->run($test, $expected_result, $test_name);
            
            //Generación Reporte de Ejecución de las Pruebas
            echo $this->unit->report();
            
        }
        
        /**
         * Método accesorio al testeo del controlador. Se añade el estado del socio, ya que se debe simular
         * que se está leyendo el estado de un socio persisitido en la base de datos.
         * Retorna un array con el estado y la fecha de vencimiento actualizadas, si corresponde.
         * 
         * @param type $idEstado
         * @param type $diaVencimientoEstado
         * @param type $mesVencimientoEstado
         * @param type $anioVencimientoEstado
         * @param type $diaActual
         * @param type $mesActual
         * @param type $anioActual
         * @return type 
         */
        public function actualizarEstadoTest($idEstado,$diaVencimientoEstado,$mesVencimientoEstado,
                            $anioVencimientoEstado,$diaActual,$mesActual,$anioActual){
            
            $fechaVencimiento = new DateTime($mesVencimientoEstado.'/'.$diaVencimientoEstado.'/'.$anioVencimientoEstado);
            
            if($this->fechaMayor($diaVencimientoEstado,$mesVencimientoEstado,$anioVencimientoEstado,
                                                $diaActual,$mesActual,$anioActual)){
                
                switch ($idEstado) {
                    case 1:
                            $idEstado = 2;
                            $diaVencimientoEstado = $fechaVencimiento->modify('+1 month')->format('d');
                            $mesVencimientoEstado = $fechaVencimiento->format('m');
                            $anioVencimientoEstado = $fechaVencimiento->format('Y');

                        break;

                    case 2:
                            $idEstado = 3;
                            $diaVencimientoEstado = $fechaVencimiento->modify('+10 month')->format('d');
                            $mesVencimientoEstado = $fechaVencimiento->format('m');
                            $anioVencimientoEstado = $fechaVencimiento->format('Y');

                        break;

                     case 3:
                            $idEstado = 4;
                            $diaVencimientoEstado = $fechaVencimiento->modify('+24 month')->format('d');
                            $mesVencimientoEstado = $fechaVencimiento->format('m');
                            $anioVencimientoEstado = $fechaVencimiento->format('Y');

                        break;

                     case 4:
                            $idEstado = 5;
                            $diaVencimientoEstado = $fechaVencimiento->modify('+99 year')->format('d');
                            $mesVencimientoEstado = $fechaVencimiento->format('m');
                            $anioVencimientoEstado = $fechaVencimiento->format('Y');

                         break;

                }
                
            }
            
            return array($idEstado,$diaVencimientoEstado,$mesVencimientoEstado,
                            $anioVencimientoEstado);
            
        }
        
    }
    
?>